////////////////////////////////////////////////////////////////////////////////

#ifndef _SHAPESFACTORY_H_
#define _SHAPESFACTORY_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _CIRCLE_H_
#include "circle.h"
#endif

#ifndef _POLYGON_H_
#include "polygon.h"
#endif

////////////////////////////////////////////////////////////////////////////////


/** Shapes factory (singleton). Creates different shapes.
*   Each shape exists at single copy.
*
*  @author   Anastasia Karpinska
*  @since    Dec 5th, 2009
*  @updated  Dec 5th, 2009
*/
class ShapesFactory
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Returns instance of shapes factory */
    static ShapesFactory* GetInstance();


////////////////////////////////////////////////////////////////////////////////


    /** Returns player shape */
    const PE::Shape* GetPlayerShape() const;


    /** Returns bullet shape */
    const PE::Shape* GetBulletShape() const;


    /** Returns wall shape */
    const PE::Shape* GetWallShape() const;


    /** Returns border shape */
    const PE::Shape* GetBorderShape() const;


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ShapesFactory();


    /** Destructor */
    ~ShapesFactory();


////////////////////////////////////////////////////////////////////////////////


    /** Returns wall points */
    PE::Points GetWallPoints() const;


    /** Returns border points */
    PE::Points GetBorderPoints() const;


////////////////////////////////////////////////////////////////////////////////


    /** Factory instance */
    static ShapesFactory* m_Instance;


////////////////////////////////////////////////////////////////////////////////


    /** Player shape */
    PE::Circle m_Player;


    /** Bullet shape */
    PE::Circle m_Bullet;


    /** Wall shape */
    PE::Polygon m_Wall;


    /** Border shape */
    PE::Polygon m_Border;


////////////////////////////////////////////////////////////////////////////////

};

////////////////////////////////////////////////////////////////////////////////

#endif
